home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / 80x0393.zip / CRC32.ASM < prev    next >
Assembly Source File  |  1993-03-30  |  8KB  |  196 lines

  1. IDEAL
  2. ; This CRC-32 routine and tables were converted from code discovered
  3. ; in the DEZIP.PAS V2.0 by R. P. Byrne.  The comments there are:
  4. ;
  5. ; Converted to Turbo Pascal (tm) V4.0 March, 1988 by J.R.Louvau
  6. ; COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or
  7. ; code or tables extracted from it, as desired without restriction.
  8. ;
  9. ; First, the polynomial itself and its table of feedback terms.  The
  10. ; polynomial is
  11. ; X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
  12. ;
  13. ; Note that we take it "backwards" and put the highest-order term in
  14. ; the lowest-order bit.  The X^32 term is "implied"; the LSB is the
  15. ; X^31 term, etc.  The X^0 term (usually shown as "+1") results in
  16. ; the MSB being 1.
  17. ;
  18. ; Note that the usual hardware shift register implementation, which
  19. ; is what we're using (we're merely optimizing it by doing eight-bit
  20. ; chunks at a time) shifts bits into the lowest-order term.  In our
  21. ; implementation, that means shifting towards the right.  Why do we
  22. ; do it this way?  Because the calculated CRC must be transmitted in
  23. ; order from highest-order term to lowest-order term.  UARTs transmit
  24. ; characters in order from LSB to MSB.  By storing the CRC this way,
  25. ; we hand it to the UART in the order low-byte to high-byte; the UART
  26. ; sends each low-bit to high-bit; and the result is transmission bit
  27. ; by bit from highest- to lowest-order term without requiring any bit
  28. ; shuffling on our part.  Reception works similarly.
  29. ;
  30. ; The feedback terms table consists of 256, 32-bit entries.  Notes:
  31. ;
  32. ;     The table can be generated at runtime if desired; code to do so
  33. ;     is shown later.  It might not be obvious, but the feedback
  34. ;     terms simply represent the results of eight shift/xor opera-
  35. ;     tions for all combinations of data and CRC register values.
  36. ;
  37. ;     The values must be right-shifted by eight bits by the "updcrc"
  38. ;     logic; the shift must be unsigned (bring in zeroes).  On some
  39. ;     hardware you could probably optimize the shift in assembler by
  40. ;     using byte-swap instructions.
  41. ;     polynomial $edb88320
  42. ;
  43. ; <End of Pascal version comments>
  44. ;
  45. ; The Pascal logic is:
  46. ;
  47. ; Function UpdC32(Octet: Byte; Crc: LongInt) : LongInt;
  48. ; Begin
  49. ;
  50. ;   UpdC32 := CRC_32_TAB[Byte(Crc XOR LongInt(Octet))] XOR ((Crc SHR 8)
  51. ;             AND $00FFFFFF);
  52. ;
  53. ; End {UpdC32};
  54. ;
  55. ; This routine computes the 32 bit CRC used by PKZIP and its derivatives,
  56. ; and by Chuck Forsberg's "ZMODEM" protocol.  The block CRC computation
  57. ; should start with high-values (0ffffffffh), and finish by inverting all
  58. ; bits.
  59. ;
  60. ; This TASM conversion done by:
  61. ;
  62. ;   Edwin T. Floyd [76067,747]
  63. ;   #9 Adams Park Ct.
  64. ;   Columbus, GA 31909
  65. ;   404-576-3305 (work)
  66. ;   404-322-0076 (home)
  67. ;
  68. ; Borland's Turbo Assembler - TASM is required to assemble this program.
  69. ;
  70.  
  71. SEGMENT code BYTE PUBLIC
  72.         ASSUME  CS:code
  73.  
  74. ;               0
  75. crc32tab dd     000000000h, 077073096h, 0ee0e612ch, 0990951bah
  76.         dd      0076dc419h, 0706af48fh, 0e963a535h, 09e6495a3h
  77.         dd      00edb8832h, 079dcb8a4h, 0e0d5e91eh, 097d2d988h
  78.         dd      009b64c2bh, 07eb17cbdh, 0e7b82d07h, 090bf1d91h
  79. ;               1
  80.         dd      01db71064h, 06ab020f2h, 0f3b97148h, 084be41deh
  81.         dd      01adad47dh, 06ddde4ebh, 0f4d4b551h, 083d385c7h
  82.         dd      0136c9856h, 0646ba8c0h, 0fd62f97ah, 08a65c9ech
  83.         dd      014015c4fh, 063066cd9h, 0fa0f3d63h, 08d080df5h
  84. ;               2
  85.         dd      03b6e20c8h, 04c69105eh, 0d56041e4h, 0a2677172h
  86.         dd      03c03e4d1h, 04b04d447h, 0d20d85fdh, 0a50ab56bh
  87.         dd      035b5a8fah, 042b2986ch, 0dbbbc9d6h, 0acbcf940h
  88.         dd      032d86ce3h, 045df5c75h, 0dcd60dcfh, 0abd13d59h
  89. ;               3
  90.         dd      026d930ach, 051de003ah, 0c8d75180h, 0bfd06116h
  91.         dd      021b4f4b5h, 056b3c423h, 0cfba9599h, 0b8bda50fh
  92.         dd      02802b89eh, 05f058808h, 0c60cd9b2h, 0b10be924h
  93.         dd      02f6f7c87h, 058684c11h, 0c1611dabh, 0b6662d3dh
  94. ;               4
  95.         dd      076dc4190h, 001db7106h, 098d220bch, 0efd5102ah
  96.         dd      071b18589h, 006b6b51fh, 09fbfe4a5h, 0e8b8d433h
  97.         dd      07807c9a2h, 00f00f934h, 09609a88eh, 0e10e9818h
  98.         dd      07f6a0dbbh, 0086d3d2dh, 091646c97h, 0e6635c01h
  99. ;               5
  100.         dd      06b6b51f4h, 01c6c6162h, 0856530d8h, 0f262004eh
  101.         dd      06c0695edh, 01b01a57bh, 08208f4c1h, 0f50fc457h
  102.         dd      065b0d9c6h, 012b7e950h, 08bbeb8eah, 0fcb9887ch
  103.         dd      062dd1ddfh, 015da2d49h, 08cd37cf3h, 0fbd44c65h
  104. ;               6
  105.         dd      04db26158h, 03ab551ceh, 0a3bc0074h, 0d4bb30e2h
  106.         dd      04adfa541h, 03dd895d7h, 0a4d1c46dh, 0d3d6f4fbh
  107.         dd      04369e96ah, 0346ed9fch, 0ad678846h, 0da60b8d0h
  108.         dd      044042d73h, 033031de5h, 0aa0a4c5fh, 0dd0d7cc9h
  109. ;               7
  110.         dd      05005713ch, 0270241aah, 0be0b1010h, 0c90c2086h
  111.         dd      05768b525h, 0206f85b3h, 0b966d409h, 0ce61e49fh
  112.         dd      05edef90eh, 029d9c998h, 0b0d09822h, 0c7d7a8b4h
  113.         dd      059b33d17h, 02eb40d81h, 0b7bd5c3bh, 0c0ba6cadh
  114. ;               8
  115.         dd      0edb88320h, 09abfb3b6h, 003b6e20ch, 074b1d29ah
  116.         dd      0ead54739h, 09dd277afh, 004db2615h, 073dc1683h
  117.         dd      0e3630b12h, 094643b84h, 00d6d6a3eh, 07a6a5aa8h
  118.         dd      0e40ecf0bh, 09309ff9dh, 00a00ae27h, 07d079eb1h
  119. ;               9
  120.         dd      0f00f9344h, 08708a3d2h, 01e01f268h, 06906c2feh
  121.         dd      0f762575dh, 0806567cbh, 0196c3671h, 06e6b06e7h
  122.         dd      0fed41b76h, 089d32be0h, 010da7a5ah, 067dd4acch
  123.         dd      0f9b9df6fh, 08ebeeff9h, 017b7be43h, 060b08ed5h
  124. ;               A
  125.         dd      0d6d6a3e8h, 0a1d1937eh, 038d8c2c4h, 04fdff252h
  126.         dd      0d1bb67f1h, 0a6bc5767h, 03fb506ddh, 048b2364bh
  127.         dd      0d80d2bdah, 0af0a1b4ch, 036034af6h, 041047a60h
  128.         dd      0df60efc3h, 0a867df55h, 0316e8eefh, 04669be79h
  129. ;               B
  130.         dd      0cb61b38ch, 0bc66831ah, 0256fd2a0h, 05268e236h
  131.         dd      0cc0c7795h, 0bb0b4703h, 0220216b9h, 05505262fh
  132.         dd      0c5ba3bbeh, 0b2bd0b28h, 02bb45a92h, 05cb36a04h
  133.         dd      0c2d7ffa7h, 0b5d0cf31h, 02cd99e8bh, 05bdeae1dh
  134. ;               C
  135.         dd      09b64c2b0h, 0ec63f226h, 0756aa39ch, 0026d930ah
  136.         dd      09c0906a9h, 0eb0e363fh, 072076785h, 005005713h
  137.         dd      095bf4a82h, 0e2b87a14h, 07bb12baeh, 00cb61b38h
  138.         dd      092d28e9bh, 0e5d5be0dh, 07cdcefb7h, 00bdbdf21h
  139. ;               D
  140.         dd      086d3d2d4h, 0f1d4e242h, 068ddb3f8h, 01fda836eh
  141.         dd      081be16cdh, 0f6b9265bh, 06fb077e1h, 018b74777h
  142.         dd      088085ae6h, 0ff0f6a70h, 066063bcah, 011010b5ch
  143.         dd      08f659effh, 0f862ae69h, 0616bffd3h, 0166ccf45h
  144. ;               E
  145.         dd      0a00ae278h, 0d70dd2eeh, 04e048354h, 03903b3c2h
  146.         dd      0a7672661h, 0d06016f7h, 04969474dh, 03e6e77dbh
  147.         dd      0aed16a4ah, 0d9d65adch, 040df0b66h, 037d83bf0h
  148.         dd      0a9bcae53h, 0debb9ec5h, 047b2cf7fh, 030b5ffe9h
  149. ;               F
  150.         dd      0bdbdf21ch, 0cabac28ah, 053b39330h, 024b4a3a6h
  151.         dd      0bad03605h, 0cdd70693h, 054de5729h, 023d967bfh
  152.         dd      0b3667a2eh, 0c4614ab8h, 05d681b02h, 02a6f2b94h
  153.         dd      0b40bbe37h, 0c30c8ea1h, 05a05df1bh, 02d02ef8dh
  154.  
  155.  
  156.         MODEL TPASCAL
  157.  
  158. PUBLIC   UpdateCRC32
  159. PROC    UpdateCRC32 FAR initcrc:DWORD,inbuf:DWORD,inlen:WORD
  160. ; UpdateCRC32 takes an initial CRC value and updates it with inlen bytes from
  161. ; inbuf. The updated CRC is returned in DX:AX.  The Pascal declaration is:
  162. ; Function UpdateCRC32(InitCRC : LongInt; Var InBuf; InLen : Word) : LongInt;
  163. ; Stomps registers: AX,BX,CX,DX,ES,SI
  164.  
  165.         push    DS
  166.         lds     si,[inbuf]      ; ds:si := ^inbuf
  167.         les     ax,[initcrc]    ; dx:ax := initcrc
  168.         mov     dx,ES
  169.         mov     cx,[inlen]      ; cx := inlen
  170. ;       or      cx,cx
  171. ;       jz      @@done
  172.         jcxz    @@done
  173. @@loop:
  174.         xor     bh,bh
  175.         mov     bl,al
  176.         lodsb
  177.         xor     bl,al
  178.         mov     al,ah
  179.         mov     ah,dl
  180.         mov     dl,dh
  181.         xor     dh,dh
  182.         shl     bx,1
  183.         shl     bx,1
  184.         les     bx,[crc32tab+bx]
  185.         xor     ax,bx
  186.         mov     bx,ES
  187.         xor     dx,bx
  188.         loop    @@loop
  189. @@done:
  190.         pop     DS
  191.         ret
  192. ENDP
  193.  
  194. ENDS
  195. END
  196.